Various data processing systems have been developed including storage systems, cellular telephone systems, and radio transmission systems. In such systems data is transferred from a sender to a receiver via some medium. For example, in a storage system, data is sent from a sender (i.e., a write function) to a receiver (i.e., a read function) via a storage medium. As information is stored and transmitted in the form of digital data, errors are introduced that, if not corrected, can corrupt the data and render the information unusable. The effectiveness of any transfer is impacted by any losses in data caused by various factors. Many types of error checking systems have been developed to detect and correct errors in digital data. For example, in perhaps the simplest system, a parity bit can be added to a group of data bits, ensuring that the group of data bits (including the parity bit) has either an even or odd number of ones. When using odd parity, as the data is prepared for storage or transmission, the number of data bits in the group that are set to one are counted, and if there is an even number of ones in the group, the parity bit is set to one to ensure that the group has an odd number of ones. If there is an odd number of ones in the group, the parity bit is set to zero to ensure that the group has an odd number of ones. After the data is retrieved from storage or received from transmission, the parity can again be checked, and if the group has an even parity, at least one error has been introduced in the data. At this simplistic level, some errors can be detected but not corrected.
The parity bit may also be used in error correction systems, including in Low Density Parity Check (LDPC) decoders, including LDPC decoders for regular and irregular LDPC codes. A regular LDPC code is one with a constant row weight and a constant column weight, that is, the same number of non-zero entries in each column of the H matrix for the LDPC code, and the same number of non-zero entries in each row of the H matrix. An irregular LDPC code, in contrast, can have non-uniform weights, that is, different column weights and different row weights. An irregular LDPC code balances the competing needs for variable nodes to have a large weight (many input connections) to quickly converge to the correct values versus check nodes with small weight (fewer input connections) to improve LDPC code performance. The non-uniform weights of an irregular LDPC code enable the variable nodes with larger weight to quickly converge to the correct values, which increases message quality to the check nodes, then helping lower weight variable nodes to converge. As a result, irregular LDPC codes can have better waterfall performance than regular LDPC codes. However, because the variable nodes with smaller column weight have fewer connected check nodes, they have less feedback and can be slower to correct errors, inhibiting convergence on correct values in the low column weight variable nodes.